如何查詢
一樣我們可以用主控台來練習:
first、last、all
這三個方法可以分別找出第一筆、最後一筆、以及全部的資料,要注意的是如果資料量較大,不要使用all,會浪費非常多的記憶體,儘量使用分頁或使用limit方法限制搜尋筆數。
g1 = Guest.first
g2 = Guest.last
g = Guest.all #g會是一個陣列
g[0] == g1 #true
find
如果知道資料的主鍵值(ID),就可以用find找出那筆資料
g3 = Guest.find(3)
find也可以接受陣列
下面兩種寫法都可以:
array = Guest.find([5,7])
array = Guest.find(5,7)
limit
可以使用limit方法限制搜尋筆數
arr = Guest.limit(5).all
arr.size #5
where
where方法可以組合出非常彈性的SQL查詢
Hash寫法
p1 = Person.where(:name => 'Bikon', :age => '25')
陣列寫法
p2 = Person.where(["name = ? or age = ?", 'Bikon', 25])
陣列寫法可以用來做or的查詢,hash則無法。
*注意別用字串寫法,以避免SQL injection
//別用以下寫法
p2 = Person.where("name = #{params[:name]}")
order
order顧名思義可以用來設定排序
g1 = Guest.order("ID DESC") #降冪排序
g2 = Guest.order("ID ASC") #升冪排序
也可以混用
p3 = Person.order("age DESC, height ASC")
如果要取消order條件可以用reorder
p3 = Person.order("age DESC").reorder("name") #改用name排序
p3 = Person.order("age DESC").reorder(nil) #取消所有排序
offset
offset可以設定忽略前幾筆不取出,通常用於資料分頁:
g = Guest.limit(5).offset(2)
這樣就不會抓出前兩筆
select
預設的SQL會抓出資料的所有欄位,而select可以用來設定只抓出資料的特定欄位。
g = Guest.select(:id, :title)
g = Guest.select("id, title")
readonly
使用readonly找出來的資料就無法修改或刪除
g = Guest.readonly.first
g.destroy #丟出ActiveRecord::ReadOnlyRecord: ActiveRecord::ReadOnlyRecord 例外